<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义指令</title>
    <script src="../js/vue.js"></script>
</head>
<body>
<!--
需求1：定义一个v-big指令，和v-text功能类似，但会把绑定的数值放大10倍。
需求2：定义一个v-fbind指令，和v-bind功能类似，但可以让其所绑定的input元素默认获取焦点。
-->
<div id="root">
    <h2>当前的n值是：<span v-text="n"></span> </h2>
    <h2>放大10倍后的n值是：<span v-big="n"></span> </h2>
    <button @click="n++">点我n+1</button>
    <input type="text" :value="n" v-fbind="n">
</div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    // 全局指令
    Vue.directive('fbind', {
        // 指令与元素成功绑定时
        bind(element, binding) {
            element.innerText = binding.value * 10
        },
        // 指令所在元素被插入页面时
        inserted(element, binding) {
            element.focus()
        },
        // 指令所在的模板被重新解析时
        update(element, binding) {
            element.innerText = binding.value * 10
        }
    })

    new Vue({
        el: '#root',
        data: {
            n: 1,
        },
        directives: {
            // element是真实的dom，binding是指定绑定的属性,函数式自定义指令
            // 触发的时机有两个：1.指令与元素成功绑定时(一上来); 2.指令所在的模板被重新解析时
            // 通过下面得到对象式可以看出，其实函数式就是bind()和update()的集合
            big(element, binding) {
                element.innerText = binding.value * 10
            },
            // 对象式自定义指令
            // fbind: {
            //     // 指令与元素成功绑定时
            //     bind(element, binding) {
            //         element.innerText = binding.value * 10
            //     },
            //     // 指令所在元素被插入页面时
            //     inserted(element, binding) {
            //         element.focus()
            //     },
            //     // 指令所在的模板被重新解析时
            //     update(element, binding) {
            //         element.innerText = binding.value * 10
            //     }
            // }
        }
    })
</script>
</html>